package proxy_aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * 作为切面的类不需要继承或实现任何一个类，只需要添加一个 @Aspect 可以把当前类定义为代理类(切面)
 * 当前类也需要Spring做bean的管理做注入，还得加一个@Component
 */
@Aspect
@Component
public class MySQLConnAspect {

    @Before("execution(* proxy_aop.CustomerCRUD_aop.*(..))")
//    public void getConn(JoinPoint jp){
//        System.out.println(jp.getSignature().getName());
//        System.out.println("已经连接数据库---aop");
//    }

    @After("execution(* proxy_aop.CustomerCRUD_aop.*(..))")
//    public void closeConn(){
//        System.out.println("已经关闭数据库---aop");
//    }

    @Around("execution(* proxy_aop.CustomerCRUD_aop.*(..))")
    public void connAndClose(ProceedingJoinPoint jd) {
        System.out.println("已经连接数据库---aop");

        //类似于动态代理中的 method.invoke 方法
        Object result = null;

        try {
            result = jd.proceed();
        } catch (Throwable e) {
            throw new RuntimeException(e);
        }

        System.out.println("已经关闭数据库---aop");
    }

    @AfterReturning(value = "execution(* proxy_aop.CustomerCRUD_aop.*(..))",returning = "result")
    public void returnResult(Object result){
        System.out.println("返回的信息："+result);
    }


}
